#ifndef SINTATICO_H_
#define SINTATICO_H_

#include <iostream>
#include <list>

#include "Hash.h"
#include "ListaTokens.h"
#include "Arvore.h"
#include "NoArvore.h"

#include "IdentificadorProcFunc.h"
#include "IdentificadorVariavel.h"
#include "IdentificadorParametro.h"


class Sintatico
{
    private:

	    ListaTokens tokens;
	    bool mIsExpressao;
        std::list<std::string> *mListaExpressao;

		int mNivelLexico;
		Hash *mTabelaHash;

        std::list<std::string> procFunc;

		void incrementaNivel();
		void decrementaNivel();
		int getNivel() const;

        void criarSubArvoreExpressao(NoArvore *parent);
    	bool programa(Arvore *parent);
	    bool bloco(NoArvore *parent);
    	bool tipo();
    	bool parametrosFormais(NoArvore *parent, IdentificadorProcFunc *pIdentificador);
    	bool comando(NoArvore *parent);
    	bool comandoSemRotulo(NoArvore *parent);
    	bool expressao();
    	bool expressaoSimples();
    	bool termo();
    	bool fator();
    	bool numero();
    	bool identificador();
    	
    	void showLista();

    	bool isTipo();

    public:

    	Sintatico();

    	~Sintatico();

	    bool analiza(Arvore *arvore, Hash *tabelaHash);

	    void setListaTokens(std::list<TToken *> pLista);
};

#endif /*SINTATICO_H_*/
